.code16                  # 指定为 16 位实模式代码
.text                    # 代码段
.global _start
# 把loader的代码加载到0x8000
_start:
    # 实模式只能通过BIOS中断来访问磁盘
    # 中断号0x13加载Loader
    # 设置loader被加载的地址
    mov $0, %ax
    mov %ax, %ds          # 数据段寄存器
    mov %ax, %ss          # 栈段寄存器
    mov %ax, %es          # 附加段寄存器
    mov %ax, %fs          # 段寄存器 fs
    mov %ax, %gs          # 段寄存器 gs

    mov $_start, %esp

ReadLoader:
    mov $0x8000,    %bx
    # 设置从磁盘的哪个扇区加载
    mov $0x2, %cl
    # 设置功能号，读取扇区
    mov $0x2, %ah
    # 设置读取扇区的数量
    mov $20, %al
    # 设置驱动号
    mov $0x0080, %dx      # DH=0, DL=0x80：驱动器号为第一个硬盘

    int $0x13
    jc ReadLoader

    # 这里写jmp $0x8000会报错，这个表示算术操作
    # 0x8000则是一个地址
    # 这里采用二级分段加载操作系统内核是因为512字节的空间太小了
    jmp 0x8000

.section boot_end, "ax"
    .byte 0x55, 0xaa
 